package br.ucb.cesbdao.persistencia.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;

import br.ucb.cesbdao.beans.Trabalhador;
import br.ucb.cesbdao.persistencia.AbstractConnectionDAO;
import br.ucb.cesbdao.persistencia.factory.FactoryConnection;
import br.ucb.cesbdao.servicos.Servicos;



public class TrabalhadorDAO extends AbstractConnectionDAO{

	private static String sqlConsulta = "SELECT * FROM daoTrabalhador T, daoPessoa P WHERE T.chavePessoa = P.chavePessoa AND P.chavePessoa > 0 ORDER BY nomePessoa";
	private static String sqlConsultaByTipo = "SELECT * FROM daoTrabalhador T, daoPessoa P WHERE T.chavePessoa = P.chavePessoa AND P.chavePessoa > 0 AND T.tipo = ? ORDER BY nomePessoa;";
	private static String sqlConsultaByNome = "SELECT * FROM daoTrabalhador T, daoPessoa P WHERE T.chavePessoa = P.chavePessoa AND P.chavePessoa > 0 AND P.nomePessoa LIKE";
	private static String sqlConsultaByStatus = "SELECT * FROM daoTrabalhador T, daoPessoa P WHERE T.chavePessoa = P.chavePessoa AND P.chavePessoa > 0 AND P.status = 'A'  ORDER BY nomePessoa";

	public TrabalhadorDAO(Connection conexao) {
		super(conexao);
	}

	public  int addTrabalhador(Trabalhador atendente, String senha) throws SQLException, ClassNotFoundException {
		String SQL_INSERT = "INSERT INTO daoTrabalhador(chavePessoa, cpf, dtNascer, acesso, status, socio, telefones, email, endereco,tipo) VALUES (?,?,?,?,?,?,?,?,?,?)";
		PreparedStatement instrucao = getConexao().prepareStatement(SQL_INSERT);

		String sqlLastId = "SELECT MAX(chavePessoa) id FROM daoPessoa";
		PreparedStatement instrucao2 = getConexao().prepareStatement(sqlLastId);
		ResultSet rs = instrucao2.executeQuery(sqlLastId);
		if(rs.first()){
			instrucao.setInt(1, rs.getInt("id"));
			instrucao.setString(2, atendente.getCpf());
			instrucao.setString(3, atendente.getDataNascimento());
			instrucao.setString(4, atendente.getAcesso());
			instrucao.setString(5, String.valueOf(atendente.getStatus()));
			instrucao.setInt(6, atendente.getIdSocio());
			instrucao.setString(7, Servicos.unFormat(atendente.getTelefone()).isEmpty()?null:atendente.getTelefone());
			instrucao.setString(8, atendente.getEmail());
			instrucao.setString(9, atendente.getEndereco());
			instrucao.setString(10, atendente.getTipo());
		}
		else
			return 0;
		int retorno = instrucao.executeUpdate();
		instrucao.close();
		return retorno;
	}

	public  int deletaTrabalhador(int id) throws SQLException, ClassNotFoundException {
		String SQL_DELETA = "DELETE FROM daoTrabalhador WHERE chavePessoa= ?";
		PreparedStatement instrucao = getConexao().prepareStatement(SQL_DELETA);
		instrucao.setInt(1, id);
		int retorno = instrucao.executeUpdate(SQL_DELETA);
		instrucao.close();
		return retorno;
	}

	public  ArrayList<Trabalhador> consultaAllTrabalhador() throws ClassNotFoundException, SQLException {
		PreparedStatement ps = getConexao().prepareStatement(sqlConsulta);
		ResultSet rs = ps.executeQuery(sqlConsulta);
		ArrayList<Trabalhador> atendentes = new ArrayList<Trabalhador>();
		while(rs.next())
			atendentes.add(new Trabalhador(rs.getInt("chavePessoa"), 
					rs.getString("nomePessoa"),
					rs.getString("sexo").charAt(0),
					rs.getString("status").charAt(0),
					rs.getInt("socio"),
					rs.getString("cpf"), 
					rs.getString("dtNascer"), 
					rs.getString("telefones"), 
					rs.getString("email"),
					rs.getString("endereco"),
					rs.getString("tipo"),
					rs.getString("acesso")));
		ps.close();
		rs.close();
		return atendentes;
	}
	public  ArrayList<Trabalhador> consultaAllTrabalhadorByTipo(String tipo) throws ClassNotFoundException, SQLException {
		PreparedStatement ps = getConexao().prepareStatement(sqlConsultaByTipo);
		ps.setString(1,tipo);
		ResultSet rs = ps.executeQuery();
		ArrayList<Trabalhador> atendentes = new ArrayList<Trabalhador>();
		while(rs.next())
			atendentes.add(new Trabalhador(rs.getInt("chavePessoa"), 
					rs.getString("nomePessoa"),
					rs.getString("sexo").charAt(0),
					rs.getString("status").charAt(0),
					rs.getInt("socio"),
					rs.getString("cpf"), 
					rs.getString("dtNascer"), 
					rs.getString("telefones"), 
					rs.getString("email"),
					rs.getString("endereco"),
					rs.getString("tipo"),
					rs.getString("acesso")));
		ps.close();
		rs.close();
		return atendentes;
	}

	public  ArrayList<Trabalhador> consultaTrabalhadorByStatus() throws ClassNotFoundException, SQLException {
		PreparedStatement ps = getConexao().prepareStatement(sqlConsultaByStatus);
		ResultSet rs = ps.executeQuery(sqlConsultaByStatus);
		ArrayList<Trabalhador> atendentes = new ArrayList<Trabalhador>();
		while(rs.next())
			atendentes.add(new Trabalhador(rs.getInt("chavePessoa"),
					rs.getString("nomePessoa"),
					rs.getString("sexo").charAt(0),
					rs.getString("status").charAt(0),
					rs.getInt("socio"),
					rs.getString("cpf"), 
					rs.getString("dtNascer"), 
					rs.getString("telefones"), 
					rs.getString("email"),
					rs.getString("endereco"),
					rs.getString("tipo"),
					rs.getString("acesso")));
		ps.close();
		rs.close();
		return atendentes;
	}

	public  Trabalhador consultaTrabalhador(String nome) throws ClassNotFoundException, SQLException {
		Statement ps = getConexao().prepareStatement(sqlConsultaByNome);
		sqlConsultaByNome = sqlConsultaByNome+"'%"+nome+"%'";
		ResultSet rs = ps.executeQuery(sqlConsultaByNome);
		Trabalhador atendente = null;
		if(rs.first())
			atendente = new Trabalhador(rs.getInt("chavePessoa"), 
					rs.getString("nomePessoa"),
					rs.getString("sexo").charAt(0),
					rs.getString("status").charAt(0),
					rs.getInt("socio"),
					rs.getString("cpf"), 
					rs.getString("dtNascer"), 
					rs.getString("telefones"), 
					rs.getString("email"),
					rs.getString("endereco"),
					rs.getString("tipo"),
					rs.getString("acesso"));
		ps.close();
		rs.close();
		return atendente;
	}

	public  Trabalhador consultaTrabalhador(Integer id) throws ClassNotFoundException, SQLException {
		String sqlConsulta = "SELECT * FROM daotrabalhador T, daoPessoa P where P.chavePessoa = T.chavePessoa AND T.chavePessoa = ?";
		PreparedStatement stm = getConexao().prepareStatement(sqlConsulta);
		stm.setInt(1,id);
		ResultSet rs = stm.executeQuery();
		Trabalhador atendente = null;
		if(rs.next())
			atendente = new Trabalhador(rs.getInt("chavePessoa"), 
					rs.getString("nomePessoa"),
					rs.getString("sexo").charAt(0),
					rs.getString("status").charAt(0),
					rs.getInt("socio"),
					rs.getString("cpf"), 
					rs.getString("dtNascer"), 
					rs.getString("telefones"), 
					rs.getString("email"),
					rs.getString("endereco"),
					rs.getString("tipo"),
					rs.getString("acesso"));
		FactoryConnection.getInstance().closeConexao(stm, rs);
		return atendente;

	}

	public  Trabalhador consultaTrabalhadorByCpf(String cpf) throws ClassNotFoundException, SQLException {
		String sqlConsultaByCpf="SELECT * FROM daotrabalhador T, daoPessoa P WHERE P.chavePessoa = T.chavePessoa and T.cpf = ";
		PreparedStatement instrucao= getConexao().prepareStatement(sqlConsultaByCpf);
		sqlConsultaByCpf = sqlConsultaByCpf+cpf;
		ResultSet rs= instrucao.executeQuery(sqlConsultaByCpf);
		Trabalhador atendente = new Trabalhador();
		if(rs.next())
			atendente = new Trabalhador(rs.getInt("chavePessoa"), 
					rs.getString("nomePessoa"),
					rs.getString("sexo").charAt(0),
					rs.getString("status").charAt(0),
					rs.getInt("socio"),
					rs.getString("cpf"), 
					rs.getString("dtNascer"), 
					rs.getString("telefones"), 
					rs.getString("email"),
					rs.getString("endereco"),
					rs.getString("tipo"),
					rs.getString("acesso"));

		instrucao.close();
		rs.close();
		return atendente;
	}

	public  boolean alteraTrabalhador(Trabalhador atendente) throws ClassNotFoundException, SQLException {
		String SQL_ALTERA = "UPDATE daoTrabalhador SET dtNascer = ?, telefones = ?, email = ? ,endereco = ?, socio = ? WHERE chavePessoa = ?";
		PreparedStatement ps = getConexao().prepareStatement(SQL_ALTERA);
		ps.setString(1, atendente.getDataNascimento());
		ps.setString(2, atendente.getTelefone());
		ps.setString(3, atendente.getEmail());
		ps.setString(4, atendente.getEndereco());
		ps.setInt(5, atendente.getIdSocio());
		ps.setInt(6, atendente.getId());
		ps.executeUpdate();
		ps.close();
		return true;
	}
	

	public  boolean inativaTrabalhador(Trabalhador atendente) throws ClassNotFoundException, SQLException {
		String SQL_ALTERA = "UPDATE daoTrabalhador SET status = ? WHERE chavePessoa = ?";
		PreparedStatement ps = getConexao().prepareStatement(SQL_ALTERA);
		
		ps.setString(1, String.valueOf(atendente.getStatus()));
		ps.setInt	(2, atendente.getId());
		ps.executeUpdate();
		ps.close();
		
		return true;
	}
}
